<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html;charset=utf-8" />
<link rel="stylesheet" href="../style/journal.css" type="text/css" />
<style type="text/css"><!--
.googleadsense {
	margin: 2px;
	padding: 0px;
//--></style><script src="http://www.google-analytics.com/urchin.js" type="text/javascript">
</script>
<script type="text/javascript">
_uacct = "UA-65008-1";
urchinTracker();
</script><title>如何用Net::SMTP发送邮件</title>
</head>
<body>
<a href="index.html">Journal</a>(2005) | <a href="../blog/"><b>Blog</b></a>(2006) | <a href="http://www.fayland.org/cgi-bin/random_link.pl">RandomLink</a> | <a href="AboutFayland.html">WhoAmI</a> | <a href="LiveBookmark.html">LiveBookmark</a> | <a href="http://www.fayland.org/">HomePage</a>
<p><&lt;Previous: <a href="041123.html">关于购买国外的虚拟主机</a>&nbsp;&nbsp;>>Next: <a href="TimePassed.html">从我出生来过去多久了？</a></p>
<h1>如何用Net::SMTP发送邮件</h1>
<div class='content'>
<p>Category: <a href='Modules.html'>Modules</a> &nbsp; Keywords: <b>Net::SMTP mail</b></p><h2>Code</h2>
如下代码为用163.com的SMTP来发送邮件。
<pre>
#!/usr/bin/perl
use Net::SMTP;

my $mailhost = "smtp.163.com"; # the smtp host
my $mailfrom = 'notfour@163.com'; # your email address
my @mailto = ('fayland@gmail.com', 'not_four@hotmail.com'); # the recipient list
my $subject = "此为标题";
my $text = "此为正文\n第二行位于此。";

$smtp = Net::SMTP->new($mailhost, Hello => 'localhost', Timeout => 120, Debug => 1);

# anth login, type your user name and password here
$smtp->auth('user','pass');

foreach my $mailto (@mailto) {
	# Send the From and Recipient for the mail servers that require it
	$smtp->mail($mailfrom);
	$smtp->to($mailto);

	# Start the mail
	$smtp->data();

	# Send the header
	$smtp->datasend("To: $mailto\n");
	$smtp->datasend("From: $mailfrom\n");
	$smtp->datasend("Subject: $subject\n");
	$smtp->datasend("\n");

	# Send the message
	$smtp->datasend("$text\n\n");

	# Send the termination string
	$smtp->dataend();
}
$smtp->quit;
</pre>
<h2>TroubleShooting/Code Analysis</h2>
<ul>
<li>为什么要 $stmp->auth('user','pass');<br>
大部分SMTP服务器为了防止 spam /垃圾邮件，就需要用户验证身份。<br>
此方法需要另外安装模块：Authen::SASL, 此模块可能系统不自带。<br>
如果系统为虚拟主机，而此模块无法安装，可使用Socket模块进行最直接的操作。详细的代码可以参考脚本<a href="http://bbs.leobbs.com">LeoBBS</a>或书籍《Perl网络编程》。
<li>Debug => 1<br>
此段代码用于测试之用，所以开启了Debug，一般测试一次完毕，正式使用的话会关闭它。
<li>需要注意的是发信人和收信人的地址要用单引号，或者用"fayland\@gmail.com"。如果是个变量，需要用正则先将其转换。<br>
<pre>$mailto =~ s/\@/\\\@/;</pre>
<li>我想发送附件，该如何做？<br>
参考《Perl网络编程》。
</ul>
<h2>邮件发送过程的简单介绍</h2>
SMTP协议由文档rfc821定义。<br>
在rfc821协议中定义了两个角色，即发送者（用S表示，指发送邮件的程序）和接收者（用R表示，指SMTP服务器）。<br>
<ol>
<li>在 S 和 R 通过套接连接后，S应当先向R表明身份，此过程用helo命令完成，helo后连接发送者的域名（可用localhost）。而R的回答是一个表示连接成功的状态码和服务器身份等。例如：
<pre>S: helo 1313s.com
R: 220 server.com Simple Mail Transfer Service Ready</pre>
在rfc821定义的状态码中，通常以2或3开头的表示成功，以4或5开头的表示传输过程出现了问题。<br>
如果是需要服务器身份验证的话，还用发送AUTH LOGIN。
<li>发送头文件。<br>
<pre>S: MAIL FROM: <someone@somewhere.com>
R: 250 OK
S: RCPT TO: <recipient@whereau.com>
R: </pre>
这里的recipient的地址如果是在SMTP同一服务器上且服务器找不到此地址，就会回答"550 No such user here"。
<li>发送正文。以DATA开始。以两个换行结束。<br>
<pre>S: DATA
R: 354 Start mail input; end with (两个换行)
S: To: recipient@whereau.com
S: From: someone@somewhere.com
S: subject: title
S: ...
S: text
S: etc.
S:
S:
R: 250 OK</pre>
<li>退出连接。<br>
<pre>S: QUIT
R: 221 server.com Service closing transmission channel</pre>
</ol>
<br>以上就是简易的连接过程。当开启Net::SMTP的debug的时候，就会输出类似于此连接过程的东西。</div>
<p><&lt;Previous: <a href="041123.html">关于购买国外的虚拟主机</a>&nbsp;&nbsp;>>Next: <a href="TimePassed.html">从我出生来过去多久了？</a></p>
<p><strong>Options:</strong> <a href='http://del.icio.us/post?title=%E5%A6%82%E4%BD%95%E7%94%A8Net::SMTP%E5%8F%91%E9%80%81%E9%82%AE%E4%BB%B6&url=http://www.fayland.org/journal/NetSMTP.html'>+Del.icio.us</a></p>
<strong>Related items</strong>
<ul><li><a href='EmailWithAttachment.html'>发送邮件附件</a> < <span class='digit'>2005-03-23 22:18:40</span> ></li></ul>
Created on <span class="digit">2004-11-26 18:38:11</span>, Last modified on <span class="digit">2004-11-26 18:41:58</span><br />
Copyright 2004-2005 All Rights Reserved. Powered by <a href="Eplanet.html">Eplanet</a> && <a href='http://catalyst.perl.org'>Catalyst</a> 5.62.
</body>
</html>